import re
import json

# 检查文本是否包含大括号且配对
def has_balanced_braces(s):
    # 如果字符串中不包含任何大括号，直接返回 False
    if '{' not in s and '}' not in s:
        return False
    
    # 初始化一个计数器
    brace_count = 0

    # 遍历字符串中的每一个字符
    for char in s:
        if char == '{':
            brace_count += 1  # 左大括号，计数器增加
        elif char == '}':
            brace_count -= 1  # 右大括号，计数器减少
            
        # 如果在遍历中任何时候右大括号多于左大括号，直接返回 False
        if brace_count < 0:
            return False

    # 最终如果 brace_count 为 0，表示括号匹配，否则不匹配
    return brace_count == 0

# 对内层 JSON 的双引号进行转义处理，只对嵌套的部分
def escape_inner_quotes(s):
    escaped_str = ''
    in_braces = False  # 跟踪是否在内层大括号内
    for i, char in enumerate(s):
        if char == '{' and i > 0:
            in_braces = True  # 进入内层 JSON
        elif char == '}':
            in_braces = False  # 退出内层 JSON
        
        # 当处于大括号内，且遇到双引号时，需要转义
        if char == '"' and in_braces:
            escaped_str += '\\"'
        else:
            escaped_str += char
    return escaped_str

# JSON解析
def parse_nested_json(text):
    # 对内层JSON的双引号进行转义
    #text = escape_inner_quotes(text)

    try:
        # 解析外层 JSON
        outer_json = json.loads(text)

        # 解析内层 JSON
        for key, value in outer_json.items():
            try:
                value = json.loads(value)
                outer_json[key] = value
            except json.JSONDecodeError as e:
                if has_balanced_braces(value):
                    raise e
        return outer_json
    except json.JSONDecodeError as e:
        raise e


# 取得文本中最后一个JSON串
def get_last_json(text) -> str:
    # 正则表达式匹配 JSON 字符串
    pattern = r'\{(?:[^{}]*|\{[^{}]*\})*\}'

    # 使用 re.findall 提取所有符合 JSON 结构的部分
    json_strings = re.findall(pattern, text)

    last_json_str = None

    # 如果找到JSON，提取最后一个
    if json_strings:
        last_json_str = json_strings[-1]
    
    return last_json_str

# 测试代码
if __name__ == '__main__':
    text = '''
    其它文本
    {"Action": "query_adcode", "args": "{\"city\": \"南京市\"}"}
    *信息查询*: {"Action": "query_adcode", "args": "{\"city\": \"北京市\"}"}
    '''

    last_json = get_last_json(text)
    print(f"last_json={last_json}")

    nested_json = parse_nested_json(last_json)
    print(f"nested_json={nested_json}")